//
//  Father.m
//  justTest
//
//  Created by 小零钱 on 2018/2/28.
//  Copyright © 2018年 小零钱. All rights reserved.
//


/*
 runtime动态添加方法
 
 应用场景：如果一个类方法非常多，加载类到内存的时候也比较耗费资源，需要给每个方法生成映射表，可以使用动态给某个类，添加方法解决。
 
 注解：OC 中我们很习惯的会用懒加载，当用到的时候才去加载它，但是实际上只要一个类实现了某个方法，就会被加载进内存。当我们不想加载这么多方法的时候，就会使用到 runtime 动态的添加方法。
 
 需求：runtime 动态添加方法处理调用一个未实现的方法 和 去除报错。
 */
#import "Father.h"
#import <objc/message.h>

@implementation Father

// 没有返回值，一个参数   void,(id,SEL)
void aaa(id self, SEL _cmd, NSNumber *meter) {
    NSLog(@"跑了%@米", meter);
}


//任何方法默认都有两个隐式参数，self,_cmd（当前方法的方法编号）
// 什么时候调用：只要一个对象调用了一个未实现的方法就会调用这个方法，进行处理
// 作用：动态添加方法，处理未实现
+ (BOOL)resolveInstanceMethod:(SEL)sel {
//    [NSStringFromSelector(sel) isEqualToString:@"run"];
    if (sel == NSSelectorFromString(@"run:")) {
        //动态添加run方法
        //class：给哪个类添加方法
        //SEL：添加哪个方法，即添加方法的方法编号
        //IMP：方法实现 => 函数 => 函数入口 => 函数名（添加方法的函数实现（函数地址））
        //type：方法类型，（返回值 + 参数类型）v：void @：对象->self :表示SEL->_cmd
        class_addMethod(self, sel, (IMP)aaa, "v@:@");
        return YES;
    }
    return [super resolveInstanceMethod:sel];
}

@end
